/* @author cerimice */
package Reportes.PDF.OrdenServicio;

import Persistencia.Definicion.OrdenServicio;
import Reportes.PDF.Formato;
import Sistema.Configuracion;
import Persistencia.Fachada.ListaFachada;

import java.util.List;
import java.util.Date;
import java.io.InputStream;
import java.util.logging.Logger;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;

import com.itextpdf.text.Document;
import com.itextpdf.text.Element;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import com.vaadin.terminal.StreamResource.StreamSource;


public class ReporteGenerarOrdenServicioPorEstado implements StreamSource
    {
    private ListaFachada                lista;
    private Formato                     formato;
    private final ByteArrayOutputStream archivoPDF;
    
    public ReporteGenerarOrdenServicioPorEstado(List<OrdenServicio> ordenes, String estado) throws Exception
        {
        lista       = new ListaFachada();
        formato     = new Formato();
        archivoPDF =  new ByteArrayOutputStream();
        this.generarReporte(ordenes,estado);
        }
    
    private void generarReporte(List<OrdenServicio> ordenes,String estado) throws Exception
        {
        Document document = null;
        try
            {
            document = new Document(PageSize.LETTER,10,10,10,10);
            PdfWriter.getInstance(document,archivoPDF);
            document.open();
                document.add(formato.generarEncabezado("LISTADO DE ORDENES DE SERVICO POR ESTADO"));
                document.add(generarTitulo(estado));
                document.add(generarCuerpo(ordenes));
            }
        catch (Exception ex)
            {Logger.getLogger(this.getClass().getName()).log(Configuracion.nivelLoggin(),ex.getMessage()); throw ex;}
        finally
            {if (document != null){document.close();}}
        }
    
    private Paragraph generarTitulo(String estado)
        {
        Paragraph titulo = new Paragraph();
            titulo.add(new Paragraph("Fecha de creación: "+ Configuracion.getFormatoFechaLarga().format(new Date()), formato.getFuenteSubtitulo()));
            titulo.add(new Paragraph("ESTADO: "+estado+"\n",formato.getFuenteTexto()));
            titulo.setAlignment(Element.ALIGN_CENTER);
        return titulo;
        }
    
    private Paragraph generarCuerpo(List<OrdenServicio> ordenes) throws Exception
        {
        try
            {
            Paragraph cuerpo = new Paragraph();
                PdfPTable datosOrdenes = new PdfPTable(4);
                    datosOrdenes.addCell(new Paragraph("FOLIO",formato.getFuenteTitulo()));
                    datosOrdenes.addCell(new Paragraph("FECHA DE ENTRADA",formato.getFuenteTitulo()));
                    datosOrdenes.addCell(new Paragraph("CLIENTE",formato.getFuenteTitulo()));
                    datosOrdenes.addCell(new Paragraph("FALLA DEL EQUIPO",formato.getFuenteTitulo()));
                    
                    for(OrdenServicio obj:ordenes)
                        {
                        datosOrdenes.addCell(new Paragraph(obj.getClave(),formato.getFuenteTexto()));
                        datosOrdenes.addCell(new Paragraph(Configuracion.getFormatoFechaCorta().format(obj.getFechaEntrada()),formato.getFuenteTexto()));
                        datosOrdenes.addCell(new Paragraph(obj.getObjCliente().getNombreCompleto(),formato.getFuenteTexto()));
                        datosOrdenes.addCell(new Paragraph(obj.getEquipoFalla(),formato.getFuenteTexto()));
                        }
                    cuerpo.add(datosOrdenes);
            return cuerpo;
            }
        catch (Exception ex)
            {Logger.getLogger(this.getClass().getName()).log(Configuracion.nivelLoggin(),ex.getMessage()); throw ex;}
        }

    @Override
    public InputStream getStream()
        {return new ByteArrayInputStream(archivoPDF.toByteArray());}
    }